题面传送门:P15521 [CCC 2016 J4] Arrival Time
题目大意
给出出发时间,考虑高峰期的特殊情况,计算到达时间。
思路讲解
本题需要对不同出发时间进行分类讨论。可分为两种大情况:
- 整个行程与高峰期完全无关,出发时间可分为:
5:00前 10:00-13:00 19:00后 - 整个行程有高峰期的存在,出发时间可分为:
5:00-6:59 7:00-10:00 13:01-14:59 15:00-19:00
1.与高峰期完全无关
非高峰期时间恒为 小时。此时的到达时间即为 。
2.有高峰期的存在
-
出发时间为非高峰,到达时间为非高峰。
(早高峰持续时间较短,此情况仅出现于早高峰前)
-
出发时间为非高峰,到达时间为高峰。
-
出发时间为高峰,到达时间为非高峰。
-
出发时间为高峰,到达时间为高峰。
针对这四种情况,我们要算出状态变化后还需行驶的时间。高峰期由于速度是原来的一半,因此处理时将时间乘二即可。
代码实现
变量声明
输入字符串
出发时间小时部分
出发时间分钟部分
到达时间小时部分
到达时间分钟部分
状态变化后还需行驶的时间
输入
输入的数据使用字符串存储,再从字符串中得出出发的小时与分钟。
cin>>s;h=(s[0]-'0')*10+s[1]-'0';m=(s[3]-'0')*10+s[4]-'0';非高峰情况
if((h<5)||(h>=19)||(h>=10&&h<13)||((h==5||h==13)&&m==0)){ ah=h+2; if(ah>=24) ah-=24; am=m;}有高峰情况
- 7:00前出发
yu=120-(7*60-(h*60+m));yu*=2;if(yu>180){//到达时间为非高峰 yu-=180; yu/=2; ah=10+yu/60; am=yu%60;}else{ ah=7+yu/60; am=yu%60;}- 7:00-10:00出发
yu=120-(10*60-(h*60+m))/2;ah=10+yu/60;am=yu%60;- 13:01-14:59出发
yu=120-(15*60-(h*60+m));yu*=2;ah=15+yu/60;am=yu%60;- 15:00-19:00出发
yu=120-(19*60-(h*60+m))/2;ah=19+yu/60;am=yu%60;输出
输出时占两位,不足用 补齐,可使用 printf 函数
printf("%02d:%02d",ah,am);完整代码
#include<bits/stdc++.h>using namespace std;string s;int h,m,ah,am,yu;int main(){ cin>>s; h=(s[0]-'0')*10+s[1]-'0'; m=(s[3]-'0')*10+s[4]-'0'; if((h<5)||(h>=19)||(h>=10&&h<13)||((h==5||h==13)&&m==0)){ ah=h+2; if(ah>=24) ah-=24; am=m; }else{ if(h<7){ yu=120-(7*60-(h*60+m)); yu*=2; if(yu>180){ yu-=180; yu/=2; ah=10+yu/60; am=yu%60; }else{ ah=7+yu/60; am=yu%60; } }else if(h>=7&&h<=10){ yu=120-(10*60-(h*60+m))/2; ah=10+yu/60; am=yu%60; }else if(h>=15&&h<=19){ yu=120-(19*60-(h*60+m))/2; ah=19+yu/60; am=yu%60; }else{ yu=120-(15*60-(h*60+m)); yu*=2; ah=15+yu/60; am=yu%60; } } printf("%02d:%02d",ah,am); return 0;}













